home *** CD-ROM | disk | FTP | other *** search
- //
- // Apple Macintosh Developer Technical Support
- // Written by: Vinnie Moscaritolo
- //
- // Copyright (work in progress) Apple Computer, Inc All rights reserved.
- //
- // You may incorporate this sample code into your applications without
- // restriction, though the sample code has been provided "AS IS" and the
- // responsibility for its operation is 100% yours. However, what you are
- // not permitted to do is to redistribute the source as "DSC Sample Code"
- // after having made changes. If you're going to re-distribute the source,
- // we require that you make it clear in the source that the code was
- // descended from Apple Sample Code, but that you've made changes.
- //
-
-
- //------------------------------------------------------------------------------------
- #pragma mark Includes
- //------------------------------------------------------------------------------------
- #include <stdio.h>
- #include <String.h>
- #include <Errors.h>
- #include <A4Stuff.h>
- #include <Dialogs.h>
- #include <Resources.h>
- #include <CodeFragments.h>
- #include <MixedMode.h>
- #include <RegisterFileLibs.h>
- #include "ClientUAM.h"
-
- // ---------------------------------------------------------------------------
- #pragma mark local Prototypes
- // ---------------------------------------------------------------------------
- typedef pascal OSStatus (*UAMCallProcPtr) (UAMArgs *theArgs);
-
-
- pascal OSStatus main (UAMArgs *theArgs);
- OSErr MAKEFSSPECFROMREFNUM (short theRefNum, FSSpec *theFileSpec);
-
- UniversalProcPtr mainAddr = nil;
- CFragConnectionID connID = nil;
-
- // ---------------------------------------------------------------------------
- pascal OSStatus main(UAMArgs *theArgs)
- // ---------------------------------------------------------------------------
- {
- OSStatus ErrNo = noErr;
- Str255 errorMessage;
- SInt16 itemHit;
-
- FSSpec theFileSpec;
- ProcPtr codePtr;
-
- EnterCodeResource();
-
- // first time through
- if(mainAddr == nil) {
-
- ErrNo = MAKEFSSPECFROMREFNUM( CurResFile(), &theFileSpec);
-
- if (ErrNo != noErr){
- DebugStr("\pError Could't make fsspec , HUH\n");
- goto Error;
- }
-
- ErrNo = RegisterFileLibs (&theFileSpec );
- if ((ErrNo != noErr ) && (ErrNo != cfragDupRegistrationErr))
- {
- DebugStr("\pError Could't make RegisterFileLibs\n");
- goto Error;
- }
-
-
- // Activate the PGPUAM ppc module
- ErrNo = GetSharedLibrary("\pPGPUAM.PPC",
- kPowerPCCFragArch,
- kReferenceCFrag,
- &connID,
- &(Ptr)codePtr,
- errorMessage);
-
- if (ErrNo != noErr){
- DebugStr("\pError Could't load PGPUAM\n");
- goto Error;
- }
-
- if (codePtr == nil) {
- DebugStr("\pError PGPUAM mainAddr == nil\n");
- CloseConnection(&connID);
- ErrNo = -1; //kOutOfMemoryErr
- goto Error;
- }
-
- mainAddr = NewRoutineDescriptorTrap(codePtr, kUAMCallProcInfo,kPowerPCISA);
- }
-
- ErrNo = ((UAMCallProcPtr)mainAddr) (theArgs);
-
- if((mainAddr != nil)
- && ( (theArgs->command == kUAMClose)
- || ((theArgs->command == kUAMOpen) && (ErrNo != noErr))))
- {
- DisposeRoutineDescriptor(mainAddr);
- CloseConnection(&connID);
- mainAddr = nil;
- }
- ExitCodeResource();
- return ErrNo;
-
- Error:
- // handle error
- StandardAlert(kAlertStopAlert,"\pPGPUAM Failed to load",nil, nil , &itemHit);
- ExitCodeResource();
- return ErrNo;
- }
-
-
- /*
- ** MakeFSSpecFromRefNum - make an FSSpec from an open path's file
- ** reference number
- **
- */
-
- OSErr MAKEFSSPECFROMREFNUM(short theRefNum, FSSpec *theFileSpec)
- {
- FCBPBRec theFCBInfo;
- OSErr theError;
-
- /* Use PBGetFCBInfo to get the relevant information */
-
- theFCBInfo.ioNamePtr = theFileSpec->name;
- theFCBInfo.ioVRefNum = 0;
- theFCBInfo.ioRefNum = theRefNum;
- theFCBInfo.ioFCBIndx = 0;
- theError = PBGetFCBInfoSync(&theFCBInfo);
- if( theError == noErr ){
- theFileSpec->vRefNum = theFCBInfo.ioFCBVRefNum;
- theFileSpec->parID = theFCBInfo.ioFCBParID;
- }
-
- return(theError);
-
- } /* MakeFSSpecFromRefNum */
-
-
-